//package com.example.demo.config;
//
//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.ObjectUtil;
//import cn.org.genplus.omicsone.framework.common.pojo.CommonResult;
//import cn.org.genplus.omicsone.framework.common.pojo.PageResult;
//import com.google.common.collect.Lists;
//import com.google.common.collect.Maps;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.stereotype.Component;
//
//import java.lang.reflect.Field;
//import java.lang.reflect.Method;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//
//@Slf4j
//@Aspect
//@Component
//public class DecryptAspect {
//
//  /**
//   * 后置解密
//   *
//   * @param point
//   * @param encryptMethod
//   */
//  @After("@annotation(encryptMethod))")
//  public Object decryptData(ProceedingJoinPoint point, EncryptMethod encryptMethod) {
//
//    try {
//      Object response = point.proceed(point.getArgs());
//      //解密
//      decryptData(encryptMethod, response);
//      return response;
//    } catch (Throwable e) {
//      e.printStackTrace();
//    }
//    return null;
//  }
//
//  @AfterReturning(value = "point()", returning = "methodResult")
//  public Object afterReturningPublish(JoinPoint joinPoint, Object methodResult) {
//    //获取方法返回值
//    String s = JsonUtils.toJsonString(methodResult);
//    System.out.println("原方法执行后会执行我！！" + s);
//    //这个返回值可以被我们篡改。
//    return methodResult;
//  }
//
//
//  //拦截需解密注解
//  @Pointcut("@annotation(com.example.demo.config.EncryptMethod)")
//  public void point() {
//
//  }
//
//  /**
//   * 环绕解密
//   *
//   * @param joinPoint
//   * @return
//   * @throws Throwable
//   */
//  @Around("point()")
//  public Object around(ProceedingJoinPoint joinPoint) {
//
//    try {
//      ///1、获取当前被@EncryptMethod注解的方法对象、注解对象
//      MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//      Method method = joinPoint.getTarget().getClass().getMethod(signature.getName(), signature.getParameterTypes());
//      EncryptMethod annotation = method.getAnnotation(EncryptMethod.class);
//
//      //2、获取执行被拦截方法后返回的结果
//      Object response = joinPoint.proceed();
//
//      ///3、对出参敏感字段解密，并返回
//      decryptData(annotation, response);
//      log.info("处理的数据是：{}", response);
//      return response;
//    } catch (Throwable e) {
//      e.printStackTrace();
//    }
//
//    return null;
//  }
//
//  /**
//   * service层返回值解密
//   *
//   * @param annotation
//   * @param response
//   */
//  private void decrypt(EncryptMethod annotation, Object response) {
//    if (ObjectUtil.isEmpty(response)) {
//      return;
//    }
//
//    // 1.分页类型
//    if (response instanceof PageResult) {
//      PageResult<?> result = (PageResult<?>) response;
//      result.getRows().forEach(item -> {
//        doDecryptObject(item, Lists.newArrayList(annotation.encryptParams()));
//      });
//    }
//
//    // 2.列表类型  fixme 待优化
//    if (response instanceof List<?>) {
//      List<?> result = (List<?>) response;
//      result.forEach(item -> {
//        doDecryptObject(item, Lists.newArrayList(annotation.encryptParams()));
//      });
//    }
//
//    // 3.其他
//    doDecryptObject(response, Lists.newArrayList(annotation.encryptParams()));
//  }
//
//  /**
//   * Controller层返回值解密
//   *
//   * @param annotation
//   * @param response
//   */
//  private void decryptData(EncryptMethod annotation, Object response) {
//    if (!Objects.isNull(response) && (response instanceof CommonResult<?>)) {
//      CommonResult<?> result = (CommonResult<?>) response;
//      if (result.getData() instanceof PageResult<?>) {
//        //若返回值为分页类型（TMPage是当前项目的分页类型，其他项目可能有自己的分页类型）
//        PageResult<?> pageResult = (PageResult<?>) result.getData();
//        pageResult.getRows().forEach(x -> doDecryptObject(x, Lists.newArrayList(annotation.decryptParams())));
//      } else if (result.getData() instanceof List<?>) {
//        //若返回值为列表类型
//        List<?> list = (List<?>) result.getData();
//        list.forEach(x -> doDecryptObject(x, Lists.newArrayList(annotation.decryptParams())));
//      } else {
//        //其他（默认为自定义实体对象）
//        doDecryptObject(result.getData(), Lists.newArrayList(annotation.decryptParams()));
//      }
//    }
//  }
//
//  private void doDecryptObject(Object object, List<String> decryptParams) {
//    if (Objects.isNull(object) || CollUtil.isEmpty(decryptParams)) {
//      return;
//    }
//
//    // 获取一个对象的所有声明的字段
//    Field[] declaredFields = object.getClass().getDeclaredFields();
//    Map<Object, Object> cipherMap = Maps.newHashMap();
//    try {
//      for (Field field : declaredFields) {
//        if (decryptParams.contains(field.getName())) {
//          // 设置对象的访问权限，保证对private的字段的访问
//          field.setAccessible(true);
//          // 获取字段值
//          String cipherText = (String) field.get(object);
//          cipherText = "解密数据" + cipherText;  //TODO 解密
//          cipherMap.put(field.getName(), cipherText);
//        }
//      }
//      BeanUtil.copyProperties(cipherMap, object);
//    } catch (Exception e) {
//      log.error(e.getMessage());
//    }
//  }
//
//
//}
